package com.wangzhen.rxjava;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;

import java.util.ArrayList;
import java.util.List;

public class RxJavaFlatMapTest {

    public static class Student{
        private String name;
        private Integer age;
        private List<Course> courseList;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public List<Course> getCourseList() {
            return courseList;
        }

        public void setCourseList(List<Course> courseList) {
            this.courseList = courseList;
        }
    }

    public static class Course{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        // 演示1：打印所有学生的名称；
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(String o) {
                System.out.println(o);
            }
        };

        // 其实就是演示了一下map这个方法，可以将一个原始的输入参数转化成另外一个输入参数
        // Func*和Action*的区别是Func1是有返回值的，而Action是没有返回值的
        Observable.from(list).map(new Func1<Student, String>() {
            @Override
            public String call(Student student) {
                return student.name;
            }
        }).subscribe(subscriber);

        // 1、这个flatMap其实就是把Student#中的courseList对象打平
        // 2、使用Observable的subscribe方法关联【观察者】的时候，也不需要每一次都事先创建好
        //    一个观察者，可以使用匿名函数的方式关联观察者
        Observable.from(list).flatMap(new Func1<Student, Observable<Course>>() {
            @Override
            public Observable<Course> call(Student student) {
                return Observable.from(student.getCourseList());
            }
        }).subscribe(new Action1<Course>() {
            @Override
            public void call(Course course) {
                System.out.println("");
            }
        });


    }
}
